#!/usr/bin/env python
# -*-coding: utf-8 -*-
# Filename: modificar_grupo.py

##
# Módulos del sistema
# Parte gráfica
try:
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
except ImportError, error:
    print error
    print "Necesitas la librería gráficas gtk+pygtk"

##
# Módulos propios
try:
    from lib.funciones_utiles import close, add_find_column
    from lib.database import Empleado, GrupoDeResolucion
except ImportError, error:
    print error
    print "Error en modificar_grupo.py"

class ModificarGrupoDeResolucion:
    def __init__(self, padre, grupo):
        self.gladefile = "gui/ghhp.glade"
        self.wTree = gtk.glade.XML(self.gladefile,"ModificarGrupoDeResolucion")
        self.window = self.wTree.get_widget("ModificarGrupoDeResolucion")
        self.grupo = grupo
        self.padre = padre
        self.un_dict = {"on_button79_clicked": self.agregar_integrante,
                "on_button80_clicked": self.quitar_integrante,
                "on_button83_clicked": self.modificar_grupo,
                "on_button91_clicked": self.close,
                "on_button95_clicked": self.registrar_cambio,
                "on_button96_clicked": self.close}
        self.wTree.signal_autoconnect(self.un_dict)
        self.window.resize(600, 400)
        # Variables
        self.hbox_29 = self.wTree.get_widget("hbox29")
        self.hbox_31 = self.wTree.get_widget("hbox31")
        self.tree_empleados = self.wTree.get_widget("treeview26")
        self.tree_integrantes = self.wTree.get_widget("treeview44")
        self.tree_confirmacion = self.wTree.get_widget("treeview45")
        self.combo_estado = self.wTree.get_widget("combobox13")
        self.lista_empleados = gtk.ListStore(str, str, str)
        self.lista_integrantes = gtk.ListStore(str, str, str)
        self.lista_confirmacion = gtk.ListStore(str, str, str)
        self.tree_empleados.set_model(self.lista_empleados)
        self.tree_integrantes.set_model(self.lista_integrantes)
        self.tree_confirmacion.set_model(self.lista_confirmacion)
        self.nombre = ''
        self.empleados = []
        self.integrantes = []
        self.nombre_grupos = []
        self.codigo_grupos = []
        self.iterador_empleado = {}
        self.iterador_integrante = {}
        self.armar_listas_resultados()
        self.armar_valores_iniciales()

    def armar_listas_resultados(self):
        """Arma las cabeceras de las vistas"""
        titulos = ("Legajo", "Apellido", "Nombre")
        lista_tree = [self.tree_empleados, self.tree_integrantes,
                self.tree_confirmacion]
        for tree in lista_tree:
            for pos, titulo in enumerate(titulos):
                add_find_column(titulo, pos, tree)
        estados = ("Activo", "Inactivo")
        for estado in estados:
            self.combo_estado.append_text(estado)
        if self.grupo.estado:
            self.combo_estado.set_active(0)
        else:
            self.combo_estado.set_active(1)

    def armar_valores_iniciales(self):
        # Empleados: debemos poner los empleados que no TENGAN un usuario aun.
        empleados = Empleado.selectBy(usuarioID=None)
        for empleado in empleados:
            self.iterador_empleado[empleado.legajo]=self.lista_empleados.append(
                    [empleado.legajo, empleado.apellido, empleado.nombre])
            self.empleados.append(empleado)
        # Integrantes del grupo:        
        for integrante in self.grupo.integrantes:
            self.iterador_integrante[
                    integrante.empleado.legajo]= self.lista_integrantes.append([
                        integrante.empleado.legajo,
                        integrante.empleado.apellido,
                        integrante.empleado.nombre])
            self.integrantes.append(integrante)
        # Codigo y nombre:
        self.wTree.get_widget("label137").set_text(str(self.grupo.id))
        self.wTree.get_widget("entry6").set_text(self.grupo.nombre)
        self.wTree.get_widget("textview24").get_buffer().set_text(
                self.grupo.descripcion)

    def agregar_integrante(self, widget):
        print "Agregar integrante"
        pos, seleccionado = self.integrante_seleccionado(1)
        if seleccionado:
            # Lo pasamos al de abajo y eliminamos uno arriba
            self.integrantes.append(self.empleados[pos])
            self.iterador_integrante[self.empleados[pos].legajo]= (
                    self.lista_integrantes.append(
                        [self.empleados[pos].legajo,
                        self.empleados[pos].apellido,
                        self.empleados[pos].nombre]))
            self.lista_empleados.remove(self.iterador_empleado[self.empleados[pos].legajo])
            self.empleados.remove(self.empleados[pos])
            self.rearmar_empleados()
        else:
            texto = "Debe seleccionar el Empleado que quiere tener como integrante."
            msj = MensajeDeError(texto, self.window)
            msj.run()
    
    def rearmar_empleados(self):
        self.iterador_empleado = {}
        self.lista_empleados.clear()
        for empleado in self.empleados:
            self.iterador_empleado[empleado.legajo]= self.lista_empleados.append(
                    [empleado.legajo, empleado.apellido, empleado.nombre])

    def integrante_seleccionado(self, tree):
        """Permite comprobar si selecciono un integrante de la lista pasada."""
        dic = {1: self.tree_empleados,
                2: self.tree_integrantes}
        model, path = dic[tree].get_selection().get_selected_rows()
        if path:
            pos, = path[0]
            return pos, True
        else:
            return "", False

    def quitar_integrante(self, widget):
        print "Quitamos integrante"
        pos, seleccionado = self.integrante_seleccionado(2)
        if seleccionado:
            # Lo pasamos al de arriba y eliminamos uno abajo
            self.empleados.append(self.integrantes[pos])
            #import pdb
            #pdb.set_trace()
            self.iterador_empleado[self.integrantes[pos].empleado.legajo]= (
                    self.lista_empleados.append(
                        [self.integrantes[pos].empleado.legajo,
                        self.integrantes[pos].empleado.apellido,
                        self.integrantes[pos].empleado.nombre]))
            self.lista_integrantes.remove(
                    self.iterador_integrante[self.integrantes[pos].empleado.legajo])
            # Al sacar integrante le seteamos el usuarioID a None.
            #import pdb
            #pdb.set_trace()
            self.integrantes[pos].empleado.set(usuarioID=None)
            self.integrantes.remove(self.integrantes[pos])
            self.rearmar_integrantes()
        else:
            texto = "Debe seleccionar el Empleado que quiere tener como integrante."
            msj = MensajeDeError(texto, self.window)
            msj.run()
    
    def rearmar_integrantes(self):
        self.iterador_integrante = {}
        self.lista_integrantes.clear()
        for integrante in self.integrantes:
            self.iterador_integrante[integrante.legajo]= self.lista_integrantes.append(
                    [integrante.legajo, integrante.apellido, integrante.nombre])

    def modificar_grupo(self, widget):
        """Muetra los datos para esperar la confirmacion del usuario"""
        self.nombre, self.estado, self.descripcion, bandera = self.datos_validos()
        if bandera:
            self.wTree.get_widget("label257").set_text(str(self.grupo.id))
            self.wTree.get_widget("label259").set_text(self.nombre)
            self.wTree.get_widget("label261").set_text(self.estado)
            self.wTree.get_widget("textview25").get_buffer().set_text(
                    self.descripcion)
            for integrante in self.integrantes:
                self.lista_confirmacion.append([integrante.id,
                    integrante.apellido, integrante.nombre])
                
    def close(self, widget):
        close(self.window)

    def registrar_cambio(self, widget):
        """Registra los cambios en la BD
        Idea para realizar los cambios
        In [142]: conjunto_1
        Out[142]: set(['rojo', 'verde', 'amarillo'])
        In [143]: conjunto_2
        Out[143]: set(['rojo', 'azul', 'blanco', 'amarillo'])
        In [148]: conjunto_2 ^ conjunto_1
        Out[148]: set(['azul', 'verde', 'blanco'])
        Solo nos resta sacar el que tenga usuarioID=None
        """
        integrantes_viejos = set(self.grupo.integrantes)
        integrantes_nuevos = set(self.integrantes)
        conjunto = integrantes_nuevos ^ integrantes_viejos
        integrantes = []
        for integrante in conjunto:
            if integrante.empleado.usuarioId:
                integrantes.append(integrante)
        # Ya tenemos los datos listos para el registro.
        # Terminar 

